package cn.peng.stu4teach.util.update;

import android.app.DownloadManager;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;

import java.io.File;

/**
 * App升级工具类。
 *
 * @author cnpeng
 */
public class AppUpdateUtil {
    private static final AppUpdateUtil ourInstance = new AppUpdateUtil();

    private AppUpdateUtil () {
    }

    public static AppUpdateUtil getInstance () {
        return ourInstance;
    }

    /**
     * 开始执行文件下载
     */
    public void startDownLoad (Context pAppCtx, String pTitle, String pDownloadUrl) {
        // 开始构建 DownloadRequest 对象
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(pDownloadUrl));
        // 构建通知栏样式
        request.setTitle(pTitle);
        request.setDescription("正在下载。。。");
        // 下载或下载完成的时候显示通知栏
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE | DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        // 指定下载的文件类型为APK
        request.setMimeType("application/vnd.android.package-archive");
        // 指定下载到本地的路径
        request.setDestinationUri(getSandboxUri4Download(pAppCtx, pDownloadUrl));
        // 指定下载到本地的路径——这样也可以
        //request.setDestinationInExternalFilesDir(pAppCtx, Environment.DIRECTORY_DOWNLOADS, "123.apk");

        DownloadManager downloadManager = (DownloadManager) pAppCtx.getSystemService(Context.DOWNLOAD_SERVICE);
        //加入Request到系统下载队列，在条件满足时会自动开始下载。返回的为下载任务的唯一ID
        long requestID = downloadManager.enqueue(request);
    }

    /**
     * 基于下载路径构建文件在本地的存储uri
     */
    private Uri getUri4Download (String downloadUrl) {
        // 构建文件名称
        String fileName = downloadUrl.substring(downloadUrl.lastIndexOf('/') + 1);
        // 存储在公共目录下的download文件夹下
        File dirFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        // 加上时间戳。避免出现检测到同名文件后不再重新下载的情况。
        Uri fileUri = Uri.fromFile(new File(dirFile, System.currentTimeMillis() + "-" + fileName));
        return fileUri;
    }

    /**
     * 基于下载路径构建文件在本地沙盒的存储uri
     * 存储在沙盒目录下不需要请求存储权限。
     */
    private Uri getSandboxUri4Download (Context pAppCtx, String downloadUrl) {
        // 构建文件名称
        String fileName = downloadUrl.substring(downloadUrl.lastIndexOf('/') + 1);
        // 存储在沙盒目录下的download文件夹下
        File dirFile = pAppCtx.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
        // 加上时间戳。避免出现检测到同名文件后不再重新下载的情况。
        File targetFile = new File(dirFile, System.currentTimeMillis() + "-" + fileName);
        return Uri.fromFile(targetFile);
    }
}
